package com.linktel.productionLine.dao;

import com.linktel.productionLine.EasyExcel.monthPlanning.model.WriteMonthlyPlanning;
import com.linktel.productionLine.entity.MonthlyPlanning;
import com.linktel.productionLine.entity.dto.monthlyPlanning.MonthlyPlanningKeyProcessDTO;
import com.linktel.productionLine.entity.dto.monthlyPlanning.MonthlyPlanningNumberDTO;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Set;

/**
 * @author Linktel
 * @description 针对表【monthly_planning(产线月度规划产能信息)】的数据库操作Mapper
 * @Date 2023-08-30 12:32:32
 */
public interface MonthlyPlanningDao {
    /**
     * 根据productionLineCode，keyStepCode，year，month查询产线月度规划产能信息
     *
     * @param productionLineCode 产线编码
     * @param keyStepCode        关键工序id
     * @param year             年
     * @param month            月
     * @param currentUserId 当前登录用户id
     * @return 产线月度规划产能信息
     */
    List<MonthlyPlanning> getMonthlyPlanningCapacityInfo(@Param("productionLineCode") String productionLineCode,
                                        @Param("keyStepCode") String keyStepCode,
                                        @Param("year") String year,
                                        @Param("month") String month,
                                        @Param("currentUserId") Long currentUserId);

    /**
     * 查询所有月度规划产能信息（不包括工序）
     *
     * @param commitUserId 当前登录用户id
     * @return 月度规划产能信息列表
     */
    Set<MonthlyPlanningNumberDTO> listMonthlyPlanningNumberDTO(@Param("commitUserId") Long commitUserId);

    /**
     * 查询所有月度规划产能关键工序信息
     *
     * @param commitUserId 当前登录用户id
     * @param productionLineCode 产线编码
     * @param year 年
     * @param month 月
     * @return 月度规划产能关键工序信息列表
     */
    List<MonthlyPlanningKeyProcessDTO> listMonthlyPlanningKeyProcessDTO(@Param("commitUserId") Long commitUserId,
                                                                        @Param("productionLineCode") String productionLineCode,
                                                                        @Param("year") Integer year,
                                                                        @Param("month") Integer month);

    /**
     * 新增产线月度规划产能信息（不包括工序）
     *
     * @param productionLineCode 产线编码
     * @param year 年
     * @param month 月
     * @param planningNumber 产线规划人数
     * @param currentUserId 当前登录用户id
     * @return 是否新增成功
     */
    Boolean addMonthlyPlanningNumber(@Param("productionLineCode") String productionLineCode,
                                     @Param("year") Integer year,
                                     @Param("month") Integer month,
                                     @Param("planningNumber") Integer planningNumber,
                                     @Param("currentUserId") Long currentUserId);

    /**
     * 修改产线月度规划产能信息（不包括工序）
     *
     * @param productionLineCode 产线编码
     * @param year 年
     * @param month 月
     * @param currentUserId 当前登录用户id
     * @param planningNumber 产线规划人数
     * @return 是否修改成功
     */
    Boolean editMonthlyPlanningNumber(@Param("productionLineCode") String productionLineCode,
                                      @Param("year") Integer year,
                                      @Param("month") Integer month,
                                      @Param("currentUserId") Long currentUserId,
                                      @Param("planningNumber") Integer planningNumber);

    /**
     * 删除产线月度规划产能信息
     *
     * @param productionLineCode 产线编码
     * @param year 年
     * @param month 月
     * @param currentUserId 当前登录用户id
     * @return 是否删除成功
     */
    Boolean deleteMonthlyPlanning(@Param("productionLineCode") String productionLineCode,
                                  @Param("year") Integer year,
                                  @Param("month") Integer month,
                                  @Param("currentUserId") Long currentUserId);

    /**
     * 新增产线月度规划关键工序信息
     *
     * @param productionLineCode 产线编码
     * @param year 年
     * @param month 月
     * @param planningNumber 月度规划人数
     * @param keyStepCode 关键工序编码
     * @param keyStepName 关键工序名称
     * @param planningCapacity 计划产能
     * @param currentUserId 当前登录用户id
     * @param maxSort 排序字段
     * @return 是否新增成功
     */
    Boolean addMonthlyPlanningKeyProcess(@Param("productionLineCode") String productionLineCode,
                                         @Param("year") Integer year,
                                         @Param("month") Integer month,
                                         @Param("planningNumber") Integer planningNumber,
                                         @Param("keyStepCode") String keyStepCode,
                                         @Param("keyStepName") String keyStepName,
                                         @Param("planningCapacity") Integer planningCapacity,
                                         @Param("currentUserId") Long currentUserId,
                                         @Param("maxSort") Integer maxSort
    );

    /**
     * 修改产线月度规划关键工序信息
     *
     * @param id 当前月度规划产能id
     * @param planningCapacity 计划产能
     * @param currentUserId 当前登录用户id
     * @return 是否修改成功
     */
    Boolean editMonthlyPlanningKeyProcess(@Param("id") Long id,
                                          @Param("planningCapacity") Integer planningCapacity,
                                          @Param("sort") Integer sort,
                                          @Param("currentUserId") Long currentUserId
    );

    /**
     * 删除产线月度规划关键工序信息
     *
     * @param id 当前月度规划产能id
     * @param currentUserId 当前登录用户id
     * @return 是否删除成功
     */
    Boolean deleteMonthlyPlanningKeyProcess(@Param("id") Long id, @Param("currentUserId") Long currentUserId);

    /**
     * 根据id得到月度规划产能信息
     *
     * @param id 当前月度规划产能id
     * @return 该id对应的月度规划产能信息
     */
    MonthlyPlanning getMonthlyPlanningById(@Param("id") Long id);

    /**
     * 批量保存月度规划产能信息
     *
     * @param list 月度产能规划信息列表
     * @param currentUserId 当前登录用户id
     */
    void batchSave(List<WriteMonthlyPlanning> list, Long currentUserId);

    /**
     * 得到月度产能规划列表
     *
     * @param commitUserId 当前登录用户信息
     * @return 月度产能规划列表
     */
    List<WriteMonthlyPlanning> listMonthlyPlanningDTO(Long commitUserId);

    /**
     * 根据用户id删除月度产能规划信息
     *
     * @param commitUserId 删除用户id
     * @param currentUserId 当前登录用户id
     */
    void deleteMonthlyPlanningByUserId(Long commitUserId, Long currentUserId);

    /**
     * 删除用户和产线的关联关系，同时删除该用户和产线相关月度产能规划信息
     *
     * @param commitUserId 删除用户id
     * @param productionLineCode 产线编码
     * @param currentUserId 当前登录用户id
     */
    void deleteMonthlyPlanningByRelation(Long commitUserId, String productionLineCode, Long currentUserId);

    /**
     * 批量删除月度规划产能信息
     *
     * @param list 月度产能规划信息列表
     * @param currentUserId 当前登录用户id
     */
    void batchDelete(List<WriteMonthlyPlanning> list, Long currentUserId);

    void batchReplaceSave(List<WriteMonthlyPlanning> list, Long currentUserId);
}
